package cn.com.anypay.manager.config;

import cn.com.anypay.manager.dto.config.WeChatAuthConfig;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * 微信网络配置验证器
 * 在应用启动时验证微信API相关的网络配置
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class WeChatNetworkConfigValidator {
    
    private final WeChatAuthConfig weChatAuthConfig;
    
    /**
     * 应用启动完成后验证配置
     */
    @EventListener(ApplicationReadyEvent.class)
    public void validateNetworkConfig() {
        log.info("开始验证微信网络配置...");
        
        List<String> errors = new ArrayList<>();
        List<String> warnings = new ArrayList<>();
        
        // 验证基础配置
        validateBasicConfig(errors, warnings);
        
        // 验证URL配置
        validateUrlConfig(errors, warnings);
        
        // 验证网络参数
        validateNetworkParams(errors, warnings);
        
        // 输出验证结果
        if (!errors.isEmpty()) {
            log.error("微信网络配置验证失败，发现 {} 个错误:", errors.size());
            errors.forEach(error -> log.error("  - {}", error));
        }
        
        if (!warnings.isEmpty()) {
            log.warn("微信网络配置验证发现 {} 个警告:", warnings.size());
            warnings.forEach(warning -> log.warn("  - {}", warning));
        }
        
        if (errors.isEmpty() && warnings.isEmpty()) {
            log.info("微信网络配置验证通过");
        }
    }
    
    /**
     * 验证基础配置
     */
    private void validateBasicConfig(List<String> errors, List<String> warnings) {
        if (!weChatAuthConfig.getEnabled()) {
            warnings.add("微信认证功能已禁用");
            return;
        }
        
        if (weChatAuthConfig.getAppId() == null || weChatAuthConfig.getAppId().trim().isEmpty()) {
            errors.add("微信应用ID未配置");
        } else if (weChatAuthConfig.getAppId().startsWith("wx_your_app_id")) {
            warnings.add("微信应用ID使用默认值，请配置实际的应用ID");
        }
        
        if (weChatAuthConfig.getAppSecret() == null || weChatAuthConfig.getAppSecret().trim().isEmpty()) {
            errors.add("微信应用密钥未配置");
        } else if (weChatAuthConfig.getAppSecret().startsWith("your_app_secret")) {
            warnings.add("微信应用密钥使用默认值，请配置实际的应用密钥");
        }
    }
    
    /**
     * 验证URL配置
     */
    private void validateUrlConfig(List<String> errors, List<String> warnings) {
        // 验证回调地址
        validateUrl(weChatAuthConfig.getRedirectUri(), "微信回调地址", errors, warnings);
        
        // 验证API地址
        validateUrl(weChatAuthConfig.getAuthUrl(), "微信授权地址", errors, warnings);
        validateUrl(weChatAuthConfig.getTokenUrl(), "微信令牌地址", errors, warnings);
        validateUrl(weChatAuthConfig.getUserInfoUrl(), "微信用户信息地址", errors, warnings);
        validateUrl(weChatAuthConfig.getRefreshTokenUrl(), "微信刷新令牌地址", errors, warnings);
        
        // 检查回调地址是否使用localhost
        if (weChatAuthConfig.getRedirectUri() != null && 
            weChatAuthConfig.getRedirectUri().contains("localhost")) {
            warnings.add("微信回调地址使用localhost，生产环境请使用实际域名");
        }
    }
    
    /**
     * 验证单个URL
     */
    private void validateUrl(String url, String name, List<String> errors, List<String> warnings) {
        if (url == null || url.trim().isEmpty()) {
            errors.add(name + "未配置");
            return;
        }
        
        try {
            URL urlObj = new URL(url);
            
            // 检查协议
            if (!"http".equals(urlObj.getProtocol()) && !"https".equals(urlObj.getProtocol())) {
                errors.add(name + "协议不正确，应为http或https: " + url);
            }
            
            // 生产环境建议使用HTTPS
            if ("http".equals(urlObj.getProtocol()) && !url.contains("localhost")) {
                warnings.add(name + "使用HTTP协议，生产环境建议使用HTTPS: " + url);
            }
            
        } catch (MalformedURLException e) {
            errors.add(name + "格式不正确: " + url + " - " + e.getMessage());
        }
    }
    
    /**
     * 验证网络参数
     */
    private void validateNetworkParams(List<String> errors, List<String> warnings) {
        // 验证超时时间
        if (weChatAuthConfig.getTimeout() == null || weChatAuthConfig.getTimeout() <= 0) {
            errors.add("API调用超时时间配置不正确: " + weChatAuthConfig.getTimeout());
        } else if (weChatAuthConfig.getTimeout() < 5000) {
            warnings.add("API调用超时时间较短，可能导致请求失败: " + weChatAuthConfig.getTimeout() + "ms");
        } else if (weChatAuthConfig.getTimeout() > 30000) {
            warnings.add("API调用超时时间较长，可能影响用户体验: " + weChatAuthConfig.getTimeout() + "ms");
        }
        
        // 验证重试次数
        if (weChatAuthConfig.getRetryCount() == null || weChatAuthConfig.getRetryCount() < 0) {
            errors.add("API调用重试次数配置不正确: " + weChatAuthConfig.getRetryCount());
        } else if (weChatAuthConfig.getRetryCount() > 5) {
            warnings.add("API调用重试次数较多，可能导致响应延迟: " + weChatAuthConfig.getRetryCount());
        }
        
        // 验证状态参数有效期
        if (weChatAuthConfig.getStateExpireSeconds() == null || weChatAuthConfig.getStateExpireSeconds() <= 0) {
            errors.add("状态参数有效期配置不正确: " + weChatAuthConfig.getStateExpireSeconds());
        } else if (weChatAuthConfig.getStateExpireSeconds() < 300) {
            warnings.add("状态参数有效期较短，可能导致用户扫码超时: " + weChatAuthConfig.getStateExpireSeconds() + "秒");
        }
    }
}